<?php

/**
 * @author askwei
 **/
class CURL
{
    private $ch;
    private $url = "http://www.baidu.com";
    private $flag_if_have_run;   //标记exec是否已经运行
    private $set_time_out = 20;  //设置curl超时时间
    private $cookie_file = "";  //cookie_file路径
    private $cookie_mode = 0;    //cookie保存模式 0不使用 1客户端、2服务器文件
    private $show_header = 0;    //是否输出返回头信息
    private $set_useragent = ""; //模拟用户使用的浏览器，默认为模拟

    //构造函数
    public function __construct($url = "")
    {
        $this->ch = curl_init();
        $this->url = $url ? $url : $this->url;
        //$this->set_useragent = $_SERVER['HTTP_USER_AGENT']; // 模拟用户使用的浏览器
        $this->set_useragent = "Mozilla/5.0 (iPhone; CPU iPhone OS 6_1_4 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/7.0 Mobile/10B350 Safari/9537.53";
        // $this->set_useragent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.143 Safari/537.36";
        //$this->cookie_file=dirname(__FILE__)."/cookie_".md5(basename(__FILE__)).".txt";    //初始化cookie文件路径
        //$this->cookie_file= SAE_TMP_PATH.TmpFS;
        $this->cookie_file = "saekv://cookie_2014.txt";
    }

    //关闭curl
    public function close()
    {
        curl_close($this->ch);
    }

    //析构函数
    public function __destruct()
    {
        $this->close();
    }

    //设置超时
    public function set_time_out($timeout = 20)
    {
        if (intval($timeout) != 0)
            $this->set_time_out = $timeout;
        return $this;
    }

    //设置来源页面
    public function set_referer($referer = "")
    {
        if (!empty($referer))
            curl_setopt($this->ch, CURLOPT_REFERER, $referer);
        return $this;
    }

    //设置cookie存放模式 1客户端、2服务器文件
    public function set_cookie_mode($mode = "")
    {
        $this->cookie_mode = $mode;
        return $this;
    }

    //载入cookie
    public function load_cookie()
    {

        if ($this->cookie_mode == 1) {
            if (isset($_COOKIE['curl'])) {
                curl_setopt($this->ch, CURLOPT_COOKIE, $_COOKIE['curl']);
            } else {
                $this->exec();
                curl_setopt($this->ch, CURLOPT_COOKIE, $this->cookie_file);
            }

        }
        if ($this->cookie_mode == 2) {

            curl_setopt($this->ch, CURLOPT_COOKIEFILE, $this->cookie_file);

        }
        if ($this->cookie_mode == 3) {
            $kv = new SaeKV();
            $ret = $kv->init();
            $ret = $kv->get('curl_cookie');
            if ($ret)
                curl_setopt($this->ch, CURLOPT_COOKIE, $ret);

        }
        return $this;
    }

    //设置保存cookie方式 $cookie_val 模式1为变量 模式2为文件路径
    public function save_cookie($cookie_val = "")
    {
        //保存在客户端
        if ($this->cookie_mode == 1 && $cookie_val) {
            setcookie('curl', $cookie_val);
        }
        //保存服务器端
        if ($this->cookie_mode == 2) {
            if (!empty($cookie_val))
                $this->cookie_file = $cookie_val;
            curl_setopt($this->ch, CURLOPT_COOKIEJAR, $this->cookie_file);
        }
        //保存在sae
        if ($this->cookie_mode == 3 && $cookie_val) {
            $kv = new SaeKV();
            $ret = $kv->init();
            $ret = $kv->get('curl_cookie');
            if ($ret) {
                $ret = $kv->set('curl_cookie', $cookie_val);

            } else {
                $ret = $kv->add('curl_cookie', $cookie_val);

            }
        }


        return $this;

    }

    //post参数 (array) $post
    public function post($post = "")
    {
        if ($post && is_array($post)) {
            curl_setopt($this->ch, CURLOPT_POST, 1);
            curl_setopt($this->ch, CURLOPT_POSTFIELDS, $post);
        }
        return $this;
    }

    //设置代理 ,例如'68.119.83.81:27977'
    public function set_proxy($proxy = "")
    {
        if ($proxy) {
            curl_setopt($this->ch, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5);
            curl_setopt($this->ch, CURLOPT_PROXY, $proxy);
        }
        return $this;
    }

    //设置伪造ip
    public function set_ip($ip = "")
    {
        if (!empty($ip))
            curl_setopt($this->ch, CURLOPT_HTTPHEADER, array("X-FORWARDED-FOR:$ip", "CLIENT-IP:$ip"));
        return $ip;
    }

    //设置是否显示返回头信息
    public function show_header($show = 0)
    {
        $this->show_header = 0;
        if ($show)
            $this->show_header = 1;
        return $this;
    }

    //设置请求头信息
    public function set_useragent($str = "")
    {
        if ($str)
            $this->set_useragent = $str;
        return $this;
    }

    //执行
    public function exec($url = "")
    {
        if (!$url) $url = $this->url;
        curl_setopt($this->ch, CURLOPT_URL, $url); // 要访问的地址
        curl_setopt($this->ch, CURLOPT_SSL_VERIFYPEER, 0); // 对认证证书来源的检查
        curl_setopt($this->ch, CURLOPT_RETURNTRANSFER, 1);    //获取的信息以文件流的形式返回
        curl_setopt($this->ch, CURLOPT_SSL_VERIFYHOST, 1); // 从证书中检查SSL加密算法是否存在
        curl_setopt($this->ch, CURLOPT_USERAGENT, $this->set_useragent); // 模拟用户使用的浏览器
        curl_setopt($this->ch, CURLOPT_FOLLOWLOCATION, 1); // 使用自动跳转
        curl_setopt($this->ch, CURLOPT_AUTOREFERER, 1); // 自动设置Referer
        curl_setopt($this->ch, CURLOPT_TIMEOUT, $this->set_time_out);  //超时设置
        curl_setopt($this->ch, CURLOPT_HEADER, $this->show_header); // 显示返回的Header区域内容
        curl_setopt($this->ch, CURLOPT_NOBODY, 0);//不返回response body内容

        $res = curl_exec($this->ch);
        $this->flag_if_have_run = true;
        if (curl_errno($this->ch)) {
            //echo 'Errno'.curl_error($this->ch);
            return false;
        }
        if ($this->show_header == 1) { //数组形式返回头信息和body信息
            list($header, $body) = explode("\r\n\r\n", $res);
            $arr['header'] = $header;
            $arr['body'] = $body;
            if ($this->cookie_mode == 1 || $this->cookie_mode == 3) {
                preg_match_all("/set\-cookie:([^\r\n]*)/i", $header, $matches);
                //print_r($matches);
                if ($matches && isset($matches[1])) {
                    $val = implode(';', array_unique(explode(';', implode(';', $matches[1])))); //去重处理
                    if ($val)
                        $this->save_cookie($val); //设置客户端保存cookie
                }
            }
            if ($arr) return $arr;
        }

        return $res;
    }


    //返回  curl_getinfo信息
    public function get_info()
    {
        if ($this->flag_if_have_run == true)
            return curl_getinfo($this->ch);
        else
            throw new Exception("<h1>需先运行( 执行exec )，再获取信息</h1>");
    }

}

?>